//package com.ruoyi.log.service.impl;
//
//import com.mongodb.bulk.BulkWriteResult;
//import com.ruoyi.common.utils.Func;
//import com.ruoyi.log.domain.AggregationQuery;
//import com.ruoyi.log.domain.MangoQuery;
//import com.ruoyi.log.service.LogService;
//import com.ruoyi.log.util.MangoUtils;
//import lombok.AllArgsConstructor;
//import org.springframework.data.domain.Sort;
//import org.springframework.data.mongodb.core.BulkOperations;
//import org.springframework.data.mongodb.core.MongoTemplate;
//import org.springframework.data.mongodb.core.aggregation.*;
//import org.springframework.data.mongodb.core.query.Criteria;
//import org.springframework.data.mongodb.core.query.Query;
//import org.springframework.stereotype.Service;
//
//import java.time.LocalDateTime;
//import java.time.format.DateTimeFormatter;
//import java.util.ArrayList;
//import java.util.List;
//import java.util.Map;
//import java.util.Set;
//
//import static org.springframework.data.mongodb.core.aggregation.Aggregation.project;
//
//@Service
//@AllArgsConstructor
//public class LogServiceImpl implements LogService {
//
//    private MongoTemplate mongoTemplate;
//
//    @Override
//    public List<Map> list(String type, String tenantCode) {
//        return mongoTemplate.findAll(Map.class, MangoUtils.getSystemCollectionName(type, tenantCode));
//    }
//
//    @Override
//    public long count(Query query, String collectionName) {
//        return mongoTemplate.count(query, collectionName);
//    }
//
//    @Override
//    public List<Map> queryAll(String systemCollectionName) {
//        return mongoTemplate.findAll(Map.class, systemCollectionName);
//    }
//
//    @Override
//    public void save(Object target, String collectionName) {
//        mongoTemplate.insert(target, collectionName);
//    }
//
//
//    @Override
//    public void submit(List<Map> target, String type) {
//        BulkOperations bulkOperations = mongoTemplate.bulkOps(BulkOperations.BulkMode.UNORDERED, "SysLogType.TAG_TOUCH");
//        bulkOperations.insert(target);
//        BulkWriteResult execute = bulkOperations.execute();
//    }
//
//    @Override
//    public List<Map> topTwenty(String systemCollectionName) {
//        Query query = new Query();
//        query.limit(20);
//        query.with(Sort.by(
//                Sort.Order.desc("touchDate")
//        ));
//        return mongoTemplate.find(query, Map.class, systemCollectionName);
//    }
//
//    @Override
//    public MangoQuery page(MangoQuery mangoQuery, String collectionName) {
//        Query query = new Query();
//        if (mangoQuery.getMap() != null) {
//            Map map = mangoQuery.getMap();
//            Set<String> set = map.keySet();
//            set.forEach(key -> {
//                if (map.get(key) != null) {
//                    query.addCriteria(Criteria.where(key).is(map.get(key)));
//                }
//            });
//        }
//        query.skip((mangoQuery.getCurrent() - 1) * mangoQuery.getSize());
//        query.with(Sort.by(
//                Sort.Order.desc("touchDate")
//        ));
//        query.limit(mangoQuery.getSize());
//        long count = mongoTemplate.count(query, collectionName);
//        mangoQuery.setTotal(count);
//        List<Map> maps = mongoTemplate.find(query, Map.class, collectionName);
//
//        mangoQuery.setRecords(maps);
//        return mangoQuery;
//    }
//
//    @Override
//    public List<Map> aggregationQuery(AggregationQuery aggregationQuery) {
//
//        DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
//        // 聚合操作
//        List<AggregationOperation> operations = new ArrayList<>();
//
//        String[] keys = aggregationQuery.getKeys();
//        String[] values = aggregationQuery.getValues();
//        boolean skipZero = false;
//        //时间范围
//        if (Func.isNotEmpty(aggregationQuery.getStartValue()) && Func.isNotEmpty(aggregationQuery.getEndValue())) {
//            //字符串
//            operations.add(Aggregation.match(Criteria
//                    .where(keys[0]).is(values[0])
//                    .andOperator(
//                            new Criteria().and(aggregationQuery.getScopeKey()).gte(LocalDateTime.parse(aggregationQuery.getStartValue(), df)),
//                            new Criteria().and(aggregationQuery.getScopeKey()).lte(LocalDateTime.parse(aggregationQuery.getEndValue(), df)))));
//            skipZero = true;
//        } else {
//            if (Func.isNotEmpty(aggregationQuery.getStartValue())) {
//                operations.add(Aggregation.match(Criteria.where(aggregationQuery.getScopeKey()).gt(LocalDateTime.parse(aggregationQuery.getStartValue()))));
//            }
//            if (Func.isNotEmpty(aggregationQuery.getEndValue())) {
//                operations.add(Aggregation.match(Criteria.where(aggregationQuery.getScopeKey()).lte(LocalDateTime.parse(aggregationQuery.getEndValue()))));
//            }
//        }
//
//        String inKey = aggregationQuery.getInKey();
//        //$in
//        if (Func.isNotEmpty(inKey)) {
//            operations.add(Aggregation.match(Criteria.where(inKey).in(aggregationQuery.getInValues())));
//        }
//
//        //  筛选条件
//        if (keys != null && keys.length > 0) {
//            for (int i = 0; i <= keys.length - 1; i++) {
//                //跳过第一个，在时间范围前已经使用
//                if (skipZero && i == 0) {
//                    break;
//                }
//                operations.add(Aggregation.match(Criteria.where(keys[i]).is(values[i])));
//            }
//        }
//
//        if (Func.isNotEmpty(aggregationQuery.getFormatDateKey())) {
//            String expression = "{$dateToString:{ format:'%" + aggregationQuery.getFormatExpression() + "',date: '$" + aggregationQuery.getFormatDateKey() + "'}}";
//            ProjectionOperation touchDate = project().andExpression(expression).as(aggregationQuery.getFormatDateKey());
//            operations.add(touchDate);
//        }
//
//        String groupKey = aggregationQuery.getGroupKey();
//        // 分组查询
//        if (Func.isNotEmpty(groupKey)) {
//            operations.add(Aggregation.group(groupKey).count().as("count"));
//        }
//
//        //统计
//        if (aggregationQuery.getCount() != null && aggregationQuery.getCount()) {
//            operations.add(Aggregation.count().as("sum"));
//        }
//
//        // 最终聚合查询所有信息
//        Aggregation aggregation = Aggregation.newAggregation(operations);
//
//        // 查询结果
//        AggregationResults<Map> results = mongoTemplate.aggregate(aggregation, aggregationQuery.getCollectionName(), Map.class);
//        //获取结果
//        return results.getMappedResults();
//    }
//
//
//}
